/**
 * 深度拷贝函数（支持多种引用类型）
 * @param obj 待拷贝的目标值（可是任意类型）
 * @returns 拷贝后的新值（与原值类型一致）
 */
export function deepCopy<T>(obj: T): T {
  // 1. 处理 null 或非对象类型（基础类型直接返回）
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }

  // 2. 处理 Date 类型
  if (obj instanceof Date) {
    return new Date(obj.getTime()) as unknown as T;
  }

  // 3. 处理 RegExp 类型（保留正则的源、标志位）
  if (obj instanceof RegExp) {
    const newRegExp = new RegExp(obj.source, obj.flags);
    newRegExp.lastIndex = obj.lastIndex; // 保留 lastIndex（全局匹配时有用）
    return newRegExp as unknown as T;
  }

  // 4. 处理 Array 类型（递归拷贝数组元素）
  if (obj instanceof Array) {
    return obj.map((item) => deepCopy(item)) as unknown as T;
  }

  // 5. 处理 Map 类型（递归拷贝 key 和 value）
  if (obj instanceof Map) {
    const newMap = new Map<T[keyof T], T[keyof T]>();
    obj.forEach((value, key) => {
      newMap.set(deepCopy(key), deepCopy(value));
    });
    return newMap as unknown as T;
  }

  // 6. 处理 Set 类型（递归拷贝元素）
  if (obj instanceof Set) {
    const newSet = new Set<T[keyof T]>();
    obj.forEach((value) => {
      newSet.add(deepCopy(value));
    });
    return newSet as unknown as T;
  }

  // 7. 处理普通对象（非上述特殊类型的对象）
  if (obj instanceof Object) {
    const result = {} as T;
    // 遍历对象自身可枚举属性（排除原型链属性）
    Object.keys(obj).forEach((key) => {
      const k = key as keyof T;
      result[k] = deepCopy(obj[k]); // 递归拷贝属性值
    });
    return result;
  }

  // 兜底：理论上不会走到这里（覆盖所有可能的对象类型）
  return obj;
}